package com.zsd.android.apteventbus;

import android.support.annotation.NonNull;
import android.util.Log;

import com.zsd.android.apteventbus.utils.MLog;
import com.zsd.android.okhttplib.ConnectionPool;
import com.zsd.android.okhttplib.bean.HttpConnection;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池学习
 */
public class MThreadPool {

    public static void main(String[] args) {

        /**
         * todo 参数一：corePoolSize 核心线程数
         * todo 参数二：maximumPoolSize 线程池非核心线程 线程池规定大小
         * todo 参数三/四：keepAliveTime时间数值 unit时间单位。重点解释一下：
         * 当正在执行的任务Runnable数 > corePoolSize的时候，参数三/四才会气作用
         * Runnable1执行完毕后，闲置一段时间（60s），如果过了闲置时间，会回收Runnable1任务，
         * 如果在闲置时间之内，就会复用Runnable1线程
         * todo 参数五：workQueue队列。
         * 会把超出的任务加入到队列中缓存起来
         */
        ExecutorService executorService = new ThreadPoolExecutor(1, 1,
                60, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());

        //或则
        //Java API 提供的创建缓存线程池
        Executors.newCachedThreadPool();

        //添加线程工厂
        ExecutorService es = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
                new ThreadFactory() {//这个是一个线程工厂
                    @Override
                    public Thread newThread(@NonNull Runnable r) {
                        Thread thread = new Thread(r);
                        //设置线程的名字
//                        thread.setName("OkHttp Dispatcher");
                        //设置不是守护线程
                        thread.setDaemon(false);
                        return thread;
                    }
                });

        ConnectionPool connectionPool = new ConnectionPool();
        test(connectionPool);
        test(connectionPool);
        test(connectionPool);
        test(connectionPool);
    }

    private static void test(ConnectionPool connectionPool) {
        // 模拟
        HttpConnection connection = connectionPool.getConnection("restapi.amap.com", 80);
        if (connection == null) {
            connection = new HttpConnection("restapi.amap.com", 80);
            System.out.println("连接池里面没有 连接对象，需要实例化一个连接对象...");
        } else {
            System.out.println("useConnectionPool: 复用和一个连接对象");
        }

        // 模拟请求
        // connection.socket .....
        // 把连接对象 加入到  连接池
        connection.setLastUseTime( System.currentTimeMillis()); // 更新时间
        connectionPool.putConnection(connection);
    }
}
